#ifndef CLink_UTILS_REGEXUTILS_H
#define CLink_UTILS_REGEXUTILS_H

#include <string>
#include "../CLink_Export.h"

namespace CLink
{
namespace Utils
{

/**
 * @brief 常用正则表达式集合，用于服务器开发
 */
class CLINK_CLASS RegexUtils
{
public:
    // IPv4地址正则 (如 192.168.1.1)
    static inline const std::string IPV4 =
        R"(^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$)";

    // IPv6地址正则 (简化版)
    static inline const std::string IPV6 =
        R"(^([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$)";

    // URL正则 (支持http/https)
    static inline const std::string URL =
        R"(^https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)$)";

    // 邮箱地址正则
    static inline const std::string EMAIL =
        R"(^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$)";

    // ISO 8601日期时间格式 (如 2023-12-31T23:59:59Z)
    static inline const std::string ISO8601_DATETIME =
        R"(^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(Z|[+-]\d{2}:\d{2})$)";

    // 用户名正则 (4-20字符，允许字母数字和下划线)
    static inline const std::string USERNAME =
        R"(^[a-zA-Z0-9_]{4,20}$)";

    // 密码强度正则 (至少8字符，包含大小写字母和数字)
    static inline const std::string PASSWORD_STRONG =
        R"(^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d]{8,}$)";

    // Windows文件路径正则 (如 C:\path\to\file.txt)
    static inline const std::string WINDOWS_FILE_PATH =
        R"(^[a-zA-Z]:\\(?:[^\\/:*?"<>|\r\n]+\\)*[^\\/:*?"<>|\r\n]*$)";

    // Unix/Linux文件路径正则 (如 /path/to/file.txt)
    static inline const std::string UNIX_FILE_PATH =
        R"(^\/(?:[^\/\0]+\/)*[^\/\0]*$)";

    // 文件名验证 (不含路径，如 file.txt)
    static inline const std::string FILENAME =
        R"(^[^\\\/:*?"<>|\0]+$)";

    // 文件扩展名验证 (如 .txt, .jpg)
    static inline const std::string FILE_EXTENSION =
        R"(^\.[a-zA-Z0-9]+$)";

    // Windows文件夹路径正则 (如 C:\path\to\folder\)
    static inline const std::string WINDOWS_DIR_PATH =
        R"(^[a-zA-Z]:\\(?:[^\\/:*?"<>|\r\n]+\\)*$)";

    // Unix/Linux文件夹路径正则 (如 /path/to/folder/)
    static inline const std::string UNIX_DIR_PATH =
        R"(^\/(?:[^\/\0]+\/)*$)";

    // 文件夹名称验证 (单个文件夹名，不含路径)
    static inline const std::string DIRNAME =
        R"(^[^\\\/:*?"<>|\0]+$)";
};

} // namespace Utils
} // namespace CLink

#endif // CLink_UTILS_REGEXUTILS_H